#include <bits/stdc++.h>
using namespace std;

/* 
2566. 替换一个数字后的最大差值
已解答
简单
相关标签
premium lock icon
相关企业
提示
给你一个整数 num 。你知道 Danny Mittal 会偷偷将 0 到 9 中的一个数字 替换 成另一个数字。

请你返回将 num 中 恰好一个 数字进行替换后，得到的最大值和最小值的差为多少。

注意：

当 Danny 将一个数字 d1 替换成另一个数字 d2 时，Danny 需要将 nums 中所有 d1 都替换成 d2 。
Danny 可以将一个数字替换成它自己，也就是说 num 可以不变。
Danny 可以将数字分别替换成两个不同的数字分别得到最大值和最小值。
替换后得到的数字可以包含前导 0 。
Danny Mittal 获得周赛 326 前 10 名，让我们恭喜他。
 

示例 1：

输入：num = 11891
输出：99009
解释：
为了得到最大值，我们将数字 1 替换成数字 9 ，得到 99899 。
为了得到最小值，我们将数字 1 替换成数字 0 ，得到 890 。
两个数字的差值为 99009 。
示例 2：

输入：num = 90
输出：99
解释：
可以得到的最大值是 99（将 0 替换成 9），最小值是 0（将 9 替换成 0）。
所以我们得到 99 。
 

提示：

1 <= num <= 108
*/

// 法一
class Solution {
public:
    int minMaxDifference(int num) {
        // cast 一下 int --> string
        string str = to_string(num);
        // 找第一个非9 来替换
        char max_replace = '9';     // 9 最大 非9 --> 9
        for (char ch : str) {
            if (ch != '9') {
                max_replace = ch;
                break;
            }
        }
        // 最小值的情况是最高位的数字替换
        char min_replace = str[0];  // 数组第一位就是最高位
        string max_str = str;
        string min_str = str;

        // 所有max_replace --> 9 就是最大
        for (char &ch : max_str) {
            if (ch == max_replace) {
                ch = '9';
            }
        }

        // 最小情况
        for (char &ch : min_str) {
            if (ch == min_replace) {
                ch = '0';
            }
        }

        // 做完操作 str --> int 
        int max_num = stoi(max_str);
        int min_num = stoi(min_str);

        return max_num - min_num;
    }
};

// 法二
class Solution {
public:
    int minMaxDifference(int num) {
        // 将数字转换为字符串，方便逐字符处理
        string s = to_string(num);
        int m = 0, n = 0; // m存储最大值，n存储最小值
        char a; // 用于记录第一个非9的数字
        int i = 0;

        // 找到第一个非9的数字（用于生成最大值）
        while (i < s.length() && s[i] == '9') {
            ++i;
        }
        a = s[i]; // 记录需要替换的数字

        // 遍历字符串，生成最大值和最小值
        for (auto &c : s) {
            // 生成最大值：将所有a替换为9
            if (c == a) {
                m = m * 10 + 9;
            } else {
                m = m * 10 + (c - '0');
            }

            // 生成最小值：将所有最高位数字替换为0
            if (c == s[0]) {
                n = n * 10;
            } else {
                n = n * 10 + (c - '0');
            }
        }

        // 返回最大值和最小值的差
        return m - n;
    }
};